// 引入本地存储的状态
import {getToken,setToken,removeToken,getTimeStamp,setTimeStamp} from "@/utils/auth"
// 引入api接口
import { login,getuserInfo,userMessage} from "@/api/user"
// 引入router中的方法
import {resetRouter} from "@/router/index"
// 容器的状态
const state = {
  //初始花后从本地存储中读取文件
token:getToken(),
// 创建一个变量接收获取的用户信息
userInfo: {} 
}
// 修改容器vanx状态
const mutations = {
  // 同步钥匙到本地存储
  setToken(state,token){
    state.token=token
    // 同步到本地缓存
    setToken(token)
  },
  // 移除本地缓存的钥匙
  removeToken(state){
    state.token=null
    // 同步到本地
    removeToken()
  },
  // 设置用户信息
  setuserInfo(state,res){
    // 更换获取的用户信息
    state.userInfo=res
  },
  removeuserInfo(state){
 // 请空用户信息
 state.userInfo={}
  }
}
// 异步操作状态拿到token
const actions = {
async login(context,data){
 const res = await login(data)
//  判断是否调用接口成功
// 因为相应拦截器处理好了所以不用判断请求是否成功
// if(res.data.success){
context.commit("setToken",res)
// }
    // 写入时间戳记录tok的写入时间
    setTimeStamp()
 },
async getuserInfo(context){
  // 获取其他信息touken
 const res = await getuserInfo()
//  获取用户的信息
const xinxi = await userMessage(res.userId)
//  掉用setuserInfo方法存储数据
 context.commit("setuserInfo",{...res,...xinxi})
//  权限操作的后文件
 return res
 },
// 创建退出登录清空token和用户数据
logout(context){
  // 清空touken
  context.commit("removeToken")
  // 清空用户数据
  context.commit("removeuserInfo")
// 取消合并路由转为动态路由后重置路由
resetRouter()
 // 还有一步  vuex中的数据是不是还在，要清空permission模块下的state数据
  // Vuex子模块怎么调用其他子模块的action ， 都没加锁的情况下，可以随意调用
  // 不加命名空间的情况下的，所有的mutations和action都是挂载全局上，所以可以直接调用
  // 但是添加了命名空间的子模块 怎么调用 另一个加了命名空间的子模块的mutations
  // 加了命名空间的context指的不是全局的context
  // mutations名称 载荷 ， 第三个参数{ root: true }，调用根级的mutations或者action
  context.commit('permission/setRoutes', [], { root: true })
  // 重置多页签存在多签页退出留存的问题
    //子模块调用子模块，需要加第三个参数`{ root: true }`
    context.dispatch('tagsView/delAllViews', null, { root: true })
}

}
export default {
  namespaced: true,
  state,
  mutations,
  actions
}